package pincipal.pack;

import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;


import database.Consulta;

import Presupuesto.Presupuesto;
import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class EditarPresupuesto extends Activity {
	
	private TextView textViewFecha;
	private TextView textViewTotalNumeros;
    private Button pickDate;
    private Button aceptar;
    private Button cancelar;
    private Button seleccionarPartidas;
    private ListView listaPartidas;
    private EditText nombre;
    private Button volverMenuPrincipal;
    private Button calcular;
    private Button volverAtras;
    private Bundle bundle;
    private int anio;
    private int mes;
    private int dia;
    private float total;
    private boolean toast = false;
    static final int DATE_DIALOG_ID = 0;
    DatePickerDialog fecha;
    AdaptadorEditarPresupuesto adaptador;
    DecimalFormat df = new DecimalFormat("0.00");
    
    String nombreNuevo;
    String nombreOriginal;
    String fechaOriginal;
    String fechaNueva;
    
    private ArrayList<String> cantidades ;
	ArrayList<String> seleccionados;
	
	private ArrayList<String> cantidadesOriginales;
	ArrayList<String> seleccionadosOriginales;
	private ProgressDialog pd;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature( Window.FEATURE_NO_TITLE );
		setContentView(R.layout.nuevopresupuesto);
		getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
        bundle = getIntent().getExtras();
        nombreOriginal = bundle.getString("NOMBREORIGINAL");
        nombreNuevo = bundle.getString("NOMBRENUEVO");
		fechaOriginal = bundle.getString("FECHAORIGINAL");
		fechaNueva = bundle.getString("FECHANUEVA");		
		
        this.seleccionados = (ArrayList<String>) bundle.getSerializable("LISTA");
        this.seleccionadosOriginales = (ArrayList<String>) bundle.getSerializable("LISTA");
        this.cantidadesOriginales = (ArrayList<String>) bundle.getSerializable("CANTIDADES");
        llenarCantidades();
        
        this.nombre = (EditText)findViewById(R.id.nombrePresupuesto);
        this.aceptar = (Button)findViewById(R.id.botonFinalizar);
        this.cancelar = (Button)findViewById(R.id.botonCancelar);
		this.calcular = (Button)findViewById(R.id.calcular);
		this.seleccionarPartidas = (Button)findViewById(R.id.seleccionarPartidas);
        this.textViewFecha = (TextView) findViewById(R.id.dateDisplay);
        this.textViewTotalNumeros =  (TextView) findViewById(R.id.textViewTotalNumeros);
        this.pickDate = (Button) findViewById(R.id.pickDate);
        this.listaPartidas = (ListView)findViewById(R.id.listaPartidas);
        this.total = 0;
        
        ArrayAdapter<String> adaptadorSimple = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, seleccionados);
        adaptador = new AdaptadorEditarPresupuesto(this);
		listaPartidas.setAdapter(adaptador);

        pickDate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                showDialog(DATE_DIALOG_ID);
            }
        });

        final Calendar c = Calendar.getInstance();
        anio = c.get(Calendar.YEAR);
        mes = c.get(Calendar.MONTH);
        dia = c.get(Calendar.DAY_OF_MONTH);
        
        actualizarFecha(); 
		
        if(nombreNuevo.length()>0)
		{
			nombre.setText(nombreNuevo);			
		}
		
		if(fechaNueva.length()>0)
		{			
			textViewFecha.setText(fechaNueva);
		}
        
        calcularTotal();
        
        this.aceptar.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{
				calcularTotal();				
				String presupuesto = nombre.getText().toString().trim();
				
				if(presupuesto.trim().length()>0)
				{
					if(!seleccionados.isEmpty())
					{
						if(!cantidades.isEmpty())
						{ 
							if(!faltanCantidades())
							{
								if(existenCambios())
								{
									if(!nombreOriginal.equalsIgnoreCase(nombre.getText().toString().trim()))
									{
										if(!existePresupuesto(nombre.getText().toString().trim()))
										{	
											Cursor partidasPresupuesto = Consulta.consultPartidasPresupuesto(EditarPresupuesto.this, nombreOriginal);
											
											if(partidasPresupuesto.getCount() <= seleccionados.size())// si se agregaron materiales o hay que editar los existentes
											{
												Consulta.editPresupuesto(EditarPresupuesto.this, nombreOriginal,nombre.getText().toString().trim(), textViewFecha.getText().toString().trim(), String.valueOf(df.format(total)) );			
												int contador = 0;
												Iterator iteradorSeleccionados = seleccionados.listIterator();
												while( iteradorSeleccionados.hasNext() ) 
												{			
													String partida = (String)iteradorSeleccionados.next(); 
													Cursor existe = Consulta.consultPartidaPresupuesto(EditarPresupuesto.this, partida ,  nombreOriginal);
													if(existe.getCount()>0)
													{
														Consulta.editPartidaPresupuesto(EditarPresupuesto.this, nombreOriginal, nombre.getText().toString().trim(), partida, cantidades.get(contador));
														contador ++;
													}
													else
													{			
														Consulta.insertPartidaPresupuesto(EditarPresupuesto.this,  presupuesto, partida, cantidades.get(contador));
														contador ++;
													}
												}
												
												toast = true;		
												llamarDialog("Guardando");
												}
											else
											{
												Consulta.editPresupuesto(EditarPresupuesto.this, nombreOriginal,nombre.getText().toString().trim(), textViewFecha.getText().toString().trim(), String.valueOf(df.format(total)) );			
												
												ArrayList<String> partidas = new ArrayList<String>();
												if (partidasPresupuesto.moveToFirst())
								                {
								                	do {
								                		String material = partidasPresupuesto.getString(1);
								                		partidas.add(material);    
								                   } while(partidasPresupuesto.moveToNext());    	
								                } 
												
												for(int i = 0; i<partidas.size();i++)
												{
													if(!seleccionados.contains(partidas.get(i)))
													{
														Consulta.deletePartidaPresupuesto(EditarPresupuesto.this, "'"+nombreOriginal+"'", "'"+partidas.get(i)+"'");
													}							
												}
												toast = true;
												llamarDialog("Guardando");
												
											}
										}
										else
										{
											Toast.makeText(EditarPresupuesto.this, "Nombre de Presupuesto ya existe" , Toast.LENGTH_SHORT).show();
										}
										
									}
									else
									{
									
									Cursor partidasPresupuesto = Consulta.consultPartidasPresupuesto(EditarPresupuesto.this, nombreOriginal);
									
									if(partidasPresupuesto.getCount() <= seleccionados.size())// si se agregaron materiales o hay que editar los existentes
									{
										Consulta.editPresupuesto(EditarPresupuesto.this, nombreOriginal,nombre.getText().toString().trim(), textViewFecha.getText().toString().trim(), String.valueOf(df.format(total)) );			
										int contador = 0;
										Iterator iteradorSeleccionados = seleccionados.listIterator();
										while( iteradorSeleccionados.hasNext() ) 
										{			
											String partida = (String)iteradorSeleccionados.next(); 
											Cursor existe = Consulta.consultPartidaPresupuesto(EditarPresupuesto.this,partida,  nombreOriginal);
											if(existe.getCount()>0)
											{
												Consulta.editPartidaPresupuesto(EditarPresupuesto.this, nombreOriginal, nombre.getText().toString().trim(), partida, cantidades.get(contador));
												contador ++;
											}
											else
											{			
												Consulta.insertPartidaPresupuesto(EditarPresupuesto.this,  presupuesto, partida, cantidades.get(contador));
												contador ++;
											}
										}
										toast = true;			
										llamarDialog("Guardando");
										
									}
									else
									{
										Consulta.editPresupuesto(EditarPresupuesto.this, nombreOriginal,nombre.getText().toString().trim(), textViewFecha.getText().toString().trim(), String.valueOf(df.format(total)) );			
										
										ArrayList<String> partidas = new ArrayList<String>();
										if (partidasPresupuesto.moveToFirst())
						                {
						                	do {
						                		String material = partidasPresupuesto.getString(1);
						                		partidas.add(material);    
						                   } while(partidasPresupuesto.moveToNext());    	
						                } 
										
										for(int i = 0; i<partidas.size();i++)
										{
											if(!seleccionados.contains(partidas.get(i)))
											{
												Consulta.deletePartidaPresupuesto(EditarPresupuesto.this, "'"+nombreOriginal+"'", "'"+partidas.get(i)+"'");
											}							
										}
										toast = true;
										llamarDialog("Guardando");
										
									}	
								}
								
							}
							else
							{
								toast = false;
								llamarDialog("Cargando");
							}
						}
						else
						{
								Toast.makeText(EditarPresupuesto.this, "Ingrese Cantidades", Toast.LENGTH_SHORT).show();
						}
						
					}
					else
				         {
				       	  Toast.makeText(EditarPresupuesto.this, "Debe ingresar Cantidades", Toast.LENGTH_SHORT).show();
				         }
					}
					
					else 
					{
						Toast.makeText(EditarPresupuesto.this, "Debe seleccionar Partidas", Toast.LENGTH_SHORT).show();	
					}
				}
				else 
				{
					Toast.makeText(EditarPresupuesto.this, "Debe ingresar nombre de Presupuesto", Toast.LENGTH_SHORT).show();			
				}
			}
		});
        
        
        this.calcular.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{
				calcularTotal();		
			}
		});
        
        this.cancelar.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{
				toast = false;
				llamarDialog("Cargando");
			}
		});
        
        
        this.seleccionarPartidas.setOnClickListener(new OnClickListener() 
		{	
			public void onClick(View arg0) 
			{			
				Bundle bund = new Bundle();
				bund.putString("NOMBRENUEVO",nombre.getText().toString());
				bund.putString("NOMBREORIGINAL", nombreOriginal);
				bund.putString("FECHAORIGINAL", fechaOriginal);
				bund.putString("FECHANUEVA", textViewFecha.getText().toString());
				bund.putString("TIPO", "editar");
				bund.putStringArrayList("SELECCIONADOS", seleccionados);
				bund.putStringArrayList("CANTIDADES", cantidades);
				Intent intent = new Intent(EditarPresupuesto.this, SeleccionarPartidas.class);
				intent.putExtras(bund);
				startActivity(intent);					
			}
		});
        
        
        
        this.volverAtras = (Button)findViewById(R.id.volverAtras);
		this.volverAtras.setOnClickListener( new OnClickListener()
        {
        	public void onClick(View v)
        	{
        		toast = false;
        		llamarDialog("Cargando");
        	}
        	
        });
        
        this.volverMenuPrincipal = (Button)findViewById(R.id.menuPrincipal);
		this.volverMenuPrincipal.setOnClickListener( new OnClickListener()
        {
        	public void onClick(View v)
        	{
        		Intent intent = new Intent(EditarPresupuesto.this, CubicMagic.class);
        		startActivity(intent);
        	}
        	
        });
	
	}
	
	private boolean existenCambios()
	{	
		
		Cursor partidasPresupuesto = Consulta.consultPartidasPresupuesto(EditarPresupuesto.this, nombreOriginal);
		ArrayList<String> partidas = new ArrayList<String>();
		if (partidasPresupuesto.moveToFirst())
        {
        	do {
        		String material = partidasPresupuesto.getString(1);
        		partidas.add(material);    
           } while(partidasPresupuesto.moveToNext());    	
        }	
		
		if(nombreOriginal.equalsIgnoreCase(nombre.getText().toString().trim()) && 
			partidas.equals(seleccionados) && cantidadesOriginales.equals(cantidades) &&
					bundle.get("FECHAORIGINAL").equals(textViewFecha.getText().toString().trim()))
		{
			return false;
		}
		else
		{
			return true;
		}
	}
	
	private boolean existePresupuesto(String nombre)
	{
		Cursor consulta = Consulta.consultNombrePresupuesto(EditarPresupuesto.this, "'"+nombre+"'");
		if(consulta.getCount() > 0)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	
	
	private boolean faltanCantidades()
	{
		boolean retorno = false;	
		Iterator iterador = cantidades.listIterator();
			while( iterador.hasNext() ) 
			{		
				String rend = (String) iterador.next();
				if(rend.equals("--") || rend.equals("") )
		        {
			          retorno = true;						          	          							         
		        }	
				else if(rend.length()>0)
				{
					float d = Float.parseFloat(rend);
					if(d<=0)
					{
						retorno = true;
					}
				}
		    }
		return retorno;
	}
	
	
	
	class AdaptadorEditarPresupuesto extends ArrayAdapter {

		Activity context;		
		@SuppressWarnings("unchecked")
		public AdaptadorEditarPresupuesto(Activity context) 
		{
			super(context, R.layout.list_item, seleccionados);
			this.context = context;
			
		}
			
	public View getView(int position, View convertView, ViewGroup parent) {
			LayoutInflater inflater = context.getLayoutInflater();
			final int posicion = position;
			View item = inflater.inflate(R.layout.list_item_editar_presupuesto, null);						
			TextView nombrePartida = (TextView)item.findViewById(R.id.nombrePartida);
			nombrePartida.setText(seleccionados.get(position));
			
			final EditText cantidadPartida = (EditText)item.findViewById(R.id.cantidadPartida);
			cantidadPartida.setText(cantidades.get(position));
			
			Button boton = (Button)item.findViewById(R.id.eliminarPartidaPresupuesto);
			boton.setBackgroundResource(android.R.drawable.ic_menu_delete);
			boton.setOnClickListener(new OnClickListener()
			{
				public void onClick(View arg0) {			
					seleccionados.remove(posicion);
					cantidades.remove(posicion);
					cantidadesOriginales = cantidades;
					llenarCantidades();					
					notifyDataSetChanged();
					calcularTotal();
				}
			});
			
			cantidadPartida.addTextChangedListener( new TextWatcher()
			{
				public void afterTextChanged(Editable s) {
					cantidades.set(posicion, String.valueOf(s));
				}
				public void beforeTextChanged(CharSequence s, int start, int count,
						int after) {
				}
				public void onTextChanged(CharSequence s, int start, int before,
						int count) {
				}
			});
			return(item);
		}	
	}
	
	private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {
            public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                anio = year;
                mes = monthOfYear;
                dia = dayOfMonth;
                actualizarFecha();
            }
        };

    
    
    @Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
        case DATE_DIALOG_ID:          
			return new DatePickerDialog(this,
                        mDateSetListener,
                        anio, mes, dia);
        }
        return null;
    }
    
    
    private void actualizarFecha() { 	
         textViewFecha.setText(
            new StringBuilder()
                    
                    .append(dia).append("-")
                    .append(mes + 1).append("-")
                    .append(anio).append(" "));
    }
   
   
    private void llenarCantidades()
    {	
		cantidades = new ArrayList<String>();
    	int indice = seleccionados.size();
    	for(int i = 0; i< indice; i++)
    	{
    		if(!cantidadesOriginales.isEmpty())
    		{
	    		if(cantidadesOriginales.get(i) != "")
	    		{
	    			cantidades.add(i, cantidadesOriginales.get(i));
	    		}
	    		else
	    		{
	    			cantidades.add(i, "--");
	    		}
    		}
    		else
    		{
    			cantidades.add(i, "--");
    		}
       	}
    }
    
    
    
    public void calcularTotal()
    {
    	float totalLocal = 0;
    	int contador = 0;
    	double totalMaterial;
    	if(!seleccionados.isEmpty())
    	{    
    		Iterator iterador = seleccionados.listIterator();
			while( iterador.hasNext() ) 
			{				
				double cantidad;
				if(cantidades.get(contador) == "" || cantidades.get(contador).length()==0)
				{
					cantidad = 1;
				}
				else
				{
					cantidad = Double.valueOf(cantidades.get(contador));
				}
				 contador++;
		          String nombrePartida = (String)iterador.next();
		          Cursor partidass = Consulta.consultMaterialesPartida(EditarPresupuesto.this, nombrePartida);
		          int i  = 0;
		          if (partidass.moveToFirst())
		          {
		          	do {		      
		          		String material = partidass.getString(1);
		          		String rendimientoEnPartida = partidass.getString(2);
		          		Cursor rendimientoMaterial = Consulta.consultRendimientoMaterial(EditarPresupuesto.this, "'"+material+"'");
		          		double a = Double.valueOf(rendimientoEnPartida).doubleValue();
		          		String c = null;
		          		String d = null;
		          		if (rendimientoMaterial.moveToFirst())
				          {
		          			do
		          			{
		          				d = rendimientoMaterial.getString(3);
		          			} while(rendimientoMaterial.moveToNext());  
				          }
		          		
		          		c = d;
		          		
		          		double b = Double.valueOf(c).doubleValue();
		          		totalMaterial =  a*b;
		          		totalLocal = (float) (totalLocal + totalMaterial);
		          		i++;
		             } while(partidass.moveToNext());    	
		          	
		          	totalLocal = (float) ((float)totalLocal * cantidad);
		          	String totalPesos;
		          }
			}	
			Cursor uf = Consulta.consultUF(EditarPresupuesto.this, "uf");
			double partida = 22627.36;
			if (uf.moveToFirst())
            {
            	do {
            		partida = Double.parseDouble(uf.getString(1));
                   } while(uf.moveToNext());
            }
			total = (float) (totalLocal*partida);
			
			textViewTotalNumeros.setText(String.valueOf(df.format(total)));
    	}
    	else
    	{
    		 textViewTotalNumeros.setText(String.valueOf(total));
    	}
    }
 
    private void actualizar()
    {
    	Cursor fila =(Cursor)Consulta.consultPresupuestos(EditarPresupuesto.this);
		String[] lista = new String[]{};
		lista = new String[fila.getCount()];
		ArrayList<Presupuesto> array = new ArrayList<Presupuesto>();
		int i = 0;
		Presupuesto presupuesto;
		if (fila.moveToFirst())
        {
        	do {               
        		lista[i] = fila.getString(2);
        		String nombrePresupuesto = fila.getString(2);
        		presupuesto = new Presupuesto(nombrePresupuesto , fila.getString(1));     		
        		array.add(array.size(), presupuesto);
                i++;                
                Cursor partidas =(Cursor)Consulta.consultPartidasPresupuesto(EditarPresupuesto.this, nombrePresupuesto);
                if (partidas.moveToFirst())
                {
                	do {
                		String partida = partidas.getString(1);
                		presupuesto.setPartida(partida, partidas.getString(2));       
                   } while(partidas.moveToNext());    	
                }    
           } while(fila.moveToNext());    	
        } 	
		Bundle bundleMaterial = new Bundle();
		bundleMaterial.putStringArray("LISTA", lista);
		bundleMaterial.putString("TIPO", "presupuesto");
		Intent intent = new Intent(EditarPresupuesto.this, Buscar.class);
		intent.putExtra("ARRAY",array);
		intent.putExtras(bundleMaterial);       		
		startActivity(intent);		 	
    }
	
    private void llamarDialog(String mensaje)
	{
		pd = ProgressDialog.show(this, mensaje, "Por favor espere...", true, false);
		new DownloadTask().execute("Parametros que necesite el DownloadTask");
	}
	
	private class DownloadTask extends AsyncTask<String, Void, Object> {
        protected String doInBackground(String... args) {
            actualizar();
            return "Datos ya procesados (resultado)";
        }

        protected void onPostExecute(Object result) {
            if(toast)
         	 {
         		Toast.makeText(EditarPresupuesto.this, "Presupuesto guardado exitosamente", Toast.LENGTH_SHORT).show();			
  			
         	 }
        	
            if (EditarPresupuesto.this.pd != null) {
            	EditarPresupuesto.this.pd.dismiss();
            }
        }
   }
}
